In [66]:
import librosa
import random
import itertools
import numpy as np
import pandas as pd
import os
from numpy import mean
from numpy import std
from numpy import dstack, stack, vstack, hstack
from pandas import read_csv
import matplotlib.pyplot as plt
from scipy import signal
from scipy.signal import find_peaks
from os.path import join
from scipy.fft import fft, ifft, fftfreq, fftshift
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report, ConfusionMatrixDisplay, f1_score
from sklearn.preprocessing import MinMaxScaler, RobustScaler
from sklearn import preprocessing
import tensorflow as tf
from tensorflow.keras import Sequential,Input, layers
from tensorflow.keras.layers import Input, Dense, Dropout, Flatten, GlobalMaxPool1D, LSTM, Embedding, MaxPool1D
from tensorflow.keras.models import load_model, Model
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras.utils import to_categorical
from keras.utils.vis_utils import plot_model
from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
from keras.layers import concatenate

from mpl_toolkits.mplot3d.axes3d import Axes3D
from mpl_toolkits.mplot3d import proj3d

frame_length = 128
hop_length = 16
split_sec = 10
In [67]:
from random import gauss
from random import seed
In [68]:
file_path = 'data/'
file_list = os.listdir(file_path)
In [69]:
file_list
Out[69]:
['fast_incline.csv',
 'fast_decline.csv',
 '221108',
 'fast_gravelly.csv',
 '221107',
 '221105',
 'fast_even.csv',
 'slow_even.csv']
In [70]:
# data import
fast_incline = read_csv(file_path + file_list[0], header=None)
fast_decline = read_csv(file_path + file_list[1], header=None)
fast_gravelly = read_csv(file_path + file_list[3], header=None)
fast_even = read_csv(file_path + file_list[6], header=None)
slow_even = read_csv(file_path + file_list[7], header=None)
In [71]:
print(
    fast_even.shape,
    slow_even.shape,
    fast_incline.shape,
    fast_decline.shape,
    fast_gravelly.shape
)
(105174, 7) (88672, 7) (103681, 7) (92226, 7) (101921, 7)
In [72]:
file_list
Out[72]:
['fast_incline.csv',
 'fast_decline.csv',
 '221108',
 'fast_gravelly.csv',
 '221107',
 '221105',
 'fast_even.csv',
 'slow_even.csv']
In [73]:
terrain = fast_even
raw_data = terrain[1].to_numpy()[:-1280*split_sec]*0.7
In [87]:
print(raw_data.max() - raw_data.min())
1.795941
In [74]:
seed(1)
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
In [75]:
wn_series = raw_data + series
In [85]:
plt.figure(figsize=(8,4))
x = np.arange(len(wn_series))/1280
plt.plot(x, wn_series, label = 'with noise')
plt.plot(x, raw_data, label = 'raw signal')
plt.title('Signal comparing')
plt.xlabel('Time(s)')
plt.ylabel('A.U.(arbitary unit)')
plt.legend()
plt.xlim(0,0.3)
Out[85]:
(0.0, 0.3)
In [45]:
seed(1)

# trans = RobustScaler()

terrain = fast_even

raw_data = terrain[1].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[:-1280*split_sec]*0.7
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_even = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_even.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_even_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_even_test.shape)
(5766, 128, 6)
(793, 128, 6)
In [46]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [47]:
# trans = RobustScaler()

terrain = slow_even

raw_data = terrain[1].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[:-1280*split_sec]*0.7
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_slow_even = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_slow_even.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_slow_even_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_slow_even_test.shape)
(4735, 128, 6)
(793, 128, 6)
In [48]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [49]:
# trans = RobustScaler()

terrain = fast_incline

raw_data = terrain[1].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[:-1280*split_sec]*0.7
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_incline = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_incline.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_incline_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_incline_test.shape)
(5673, 128, 6)
(793, 128, 6)
In [50]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [51]:
# trans = RobustScaler()

terrain = fast_decline

raw_data = terrain[1].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[:-1280*split_sec]*0.7
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_decline = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_decline.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_decline_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_decline_test.shape)
(4957, 128, 6)
(793, 128, 6)
In [52]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [53]:
# trans = RobustScaler()

terrain = fast_gravelly

raw_data = terrain[1].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[:-1280*split_sec]*0.7
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[:-1280*split_sec]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_gravelly = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_gravelly.shape)

#---------------------------------------------------------------------------------------------------------------#
raw_data = terrain[1].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_1 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data1 = trans.fit_transform(frames_1)

raw_data = terrain[2].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_2 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data2 = trans.fit_transform(frames_2)

raw_data = terrain[3].to_numpy()[-1280*split_sec:]*0.7*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_3 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data3 = trans.fit_transform(frames_3)

raw_data = terrain[4].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_4 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data4 = trans.fit_transform(frames_4)

raw_data = terrain[5].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_5 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data5 = trans.fit_transform(frames_5)

raw_data = terrain[6].to_numpy()[-1280*split_sec:]*0.7
series = np.array([gauss(0.0, 0.3) for i in range(len(raw_data))])
raw_data = raw_data + series
frames_6 = librosa.util.frame(np.array(raw_data), frame_length=frame_length, hop_length=hop_length, axis=0)
# data6 = trans.fit_transform(frames_6)

# stacked_fast_even = np.dstack((data1, data2, data3, data4, data5, data6))
stacked_fast_gravelly_test = np.dstack((frames_1, frames_2, frames_3, frames_4, frames_5, frames_6))
print(stacked_fast_gravelly_test.shape)
(5563, 128, 6)
(793, 128, 6)
In [54]:
f, axes = plt.subplots(2, 3)

# 격자 크기 설정
f.set_size_inches((20, 15))

# 격자 여백 설정
plt.subplots_adjust(wspace = 0.1, hspace = 0.1)

data = frames_1
for i in range(10):
    axes[0,0].plot(data[i])
    
data = frames_2
for i in range(10):
    axes[0, 1].plot(data[i])
    
data = frames_3
for i in range(10):
    axes[0, 2].plot(data[i])
    
data = frames_4
for i in range(10):
    axes[1, 0].plot(data[i])
    
data = frames_5
for i in range(10):
    axes[1, 1].plot(data[i])
    
data = frames_6
for i in range(10):
    axes[1, 2].plot(data[i])

plt.show()
In [55]:
def label_making (x,label):
    output=[]
    
    while len(output) < len(x): 
        output.append([label])
    return (output)

# label making
y1 = label_making(stacked_fast_even,0)
y2 = label_making(stacked_slow_even,1)
y3 = label_making(stacked_fast_incline,2)
y4 = label_making(stacked_fast_decline,3)
y5 = label_making(stacked_fast_gravelly,4)

t1 = label_making(stacked_fast_even_test,0)
t2 = label_making(stacked_slow_even_test,1)
t3 = label_making(stacked_fast_incline_test,2)
t4 = label_making(stacked_fast_decline_test,3)
t5 = label_making(stacked_fast_gravelly_test,4)


# x_input = np.vstack([stacked_fast_even, stacked_slow_even, stacked_fast_incline, stacked_fast_decline, stacked_fast_gravelly])
# label_input = y1 + y2 + y3 + y4 + y5
# label_input = to_categorical(label_input)

# testX = np.vstack([stacked_fast_even_test, stacked_slow_even_test, stacked_fast_incline_test, stacked_fast_decline_test, stacked_fast_gravelly_test])
# testy = t1 + t2 + t3 + t4 + t5
# testy = to_categorical(testy)


x_input = np.vstack([stacked_fast_even, stacked_fast_incline, stacked_fast_decline, stacked_fast_gravelly])
label_input = y1 + y3 + y4 + y5
label_input = to_categorical(label_input)

testX = np.vstack([stacked_fast_even_test, stacked_fast_incline_test, stacked_fast_decline_test, stacked_fast_gravelly_test])
testy = t1 + t3 + t4 + t5
testy = to_categorical(testy)


# x_input = np.vstack([stacked_fast_even, stacked_slow_even])
# label_input = y1 + y2
# label_input = to_categorical(label_input)

# testX = np.vstack([stacked_fast_even_test, stacked_slow_even_test])
# testy = t1 + t2
# testy = to_categorical(testy)
In [56]:
print(x_input.shape,
      label_input.shape,
      testX.shape,
      testy.shape
     )
(21959, 128, 6) (21959, 5) (3172, 128, 6) (3172, 5)
In [57]:
trainX, valX, trainy, valy = train_test_split(x_input, label_input, test_size=0.33, stratify = label_input)
print( trainX.shape, valX.shape)
n_timesteps, n_features, n_outputs = trainX.shape[1], trainX.shape[2], trainy.shape[1]
(14712, 128, 6) (7247, 128, 6)
In [58]:
# fit and evaluate a model
def evaluate_model(trainX, trainy, valX, valy, testX, testy):
    
    verbose, epochs, batch_size = 0, 10, 32
    n_timesteps, n_features, n_outputs = trainX.shape[1], trainX.shape[2], trainy.shape[1]
    model = Sequential()
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features)))
    model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
    model.add(Dropout(0.5))
    model.add(MaxPooling1D(pool_size=2))
    model.add(Flatten())
    model.add(Dense(100, activation='relu'))
    model.add(Dense(n_outputs, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
    # fit network
    hist = model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose, validation_data = (valX, valy))
    # evaluate model
    loss, accuracy = model.evaluate(testX, testy, batch_size=batch_size, verbose=0)
    
    return loss, accuracy, hist
In [59]:
# loss, score, hist = evaluate_model(trainX, trainy, testX, testy)
# print(score)

loss, score, hist = evaluate_model(trainX, trainy, valX, valy, testX, testy)
print(score)
0.9810844659805298
In [60]:
verbose, epochs, batch_size = 0, 50, 32
n_timesteps, n_features, n_outputs = x_input.shape[1], x_input.shape[2], label_input.shape[1]

model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features)))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(n_outputs, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

# fit network
hist = model.fit(trainX, trainy, epochs=epochs, batch_size=batch_size, verbose=verbose, validation_data = (valX, valy))

# model.save
# model.save('saved_models/terrain_classifer_211206', overwrite=True)
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv1d_2 (Conv1D)           (None, 126, 64)           1216      
                                                                 
 conv1d_3 (Conv1D)           (None, 124, 64)           12352     
                                                                 
 dropout_1 (Dropout)         (None, 124, 64)           0         
                                                                 
 max_pooling1d_1 (MaxPooling  (None, 62, 64)           0         
 1D)                                                             
                                                                 
 flatten_1 (Flatten)         (None, 3968)              0         
                                                                 
 dense_2 (Dense)             (None, 100)               396900    
                                                                 
 dense_3 (Dense)             (None, 5)                 505       
                                                                 
=================================================================
Total params: 410,973
Trainable params: 410,973
Non-trainable params: 0
_________________________________________________________________
In [61]:
model.save('saved_models/terrain_classifer_with_noise_sensitivity_reduction_230226', overwrite=True)
WARNING:absl:Found untraced functions such as _jit_compiled_convolution_op, _jit_compiled_convolution_op, _update_step_xla while saving (showing 3 of 3). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: saved_models/terrain_classifer_with_noise_sensitivity_reduction_230226/assets
INFO:tensorflow:Assets written to: saved_models/terrain_classifer_with_noise_sensitivity_reduction_230226/assets
In [62]:
# import tensorflow as tf

# converter = tf.lite.TFLiteConverter.from_saved_model("saved_models/terrain_classifer_with_noise_230221") # path to the SavedModel directory
# # converter.optimizations = [tf.lite.Optimize.DEFAULT]

# tflite_model = converter.convert()

# # Save the model.
# with open('saved_models/terrain_classifier_211206.tflite', 'wb') as f:
#     f.write(tflite_model)
In [63]:
# !xxd -i 'saved_models/terrain_classifier_211206.tflite' > 'saved_models/terrain_classifier_211206.cc'
In [64]:
# Confusion matrix
y_predict = model.predict(testX, batch_size = 32, verbose = 0)
y_predict = np.around(y_predict)
cm = confusion_matrix(testy.argmax(axis=1), y_predict.argmax(axis=1))

# Confustion matrix plotting
plt.figure(figsize=(10,8))
plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
plt.title('confusion matrix')
plt.colorbar()
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
    plt.text(j, i, np.round(cm[i, j]/(np.sum(cm, 1)[i]), 2),
             horizontalalignment="center", fontdict={'fontsize': 40},
             color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')

# plt.savefig('saved_images/220414/confusion_matrix.svg', dpi='figure', format='svg')
Out[64]:
Text(0.5, 51.0, 'Predicted label')
In [65]:
cm
Out[65]:
array([[793,   0,   0,   0],
       [  0, 793,   0,   0],
       [ 17,   0, 775,   1],
       [  2,   0,   6, 785]])
In [96]:
# y_predict = model.predict(testX, batch_size = 32, verbose = 0)
# # disp = ConfusionMatrixDisplay.from_predictions(y_true = testy.argmax(axis=1), y_pred = y_predict.argmax(axis=1), normalize='true', 
# #                                                values_format='.2%', cmap='Blues', xticks_rotation = 15,
# #                                                display_labels=('even', 'incline', 'decline', 'gravelly'))

# y_predict = model.predict(testX, batch_size = 32, verbose = 0)
# disp = ConfusionMatrixDisplay.from_predictions(y_true = testy.argmax(axis=1), y_pred = y_predict.argmax(axis=1), normalize='true', 
#                                                values_format='.2%', cmap='Blues', xticks_rotation = 15,
#                                                display_labels=('fast', 'slow'))

# # plt.savefig('saved_images/220418/fast_slow_confusion_matrix_2class.svg', dpi='figure', format='svg')
In [86]:
print(
    f1_score(testy.argmax(axis=1), y_predict.argmax(axis=1), average='macro'),
    f1_score(testy.argmax(axis=1), y_predict.argmax(axis=1), average='micro'),
    f1_score(testy.argmax(axis=1), y_predict.argmax(axis=1), average='weighted')
     )
0.9971590343090766 0.9971626733921816 0.9971590343090765
In [87]:
pred_to0 = np.zeros(5)
pred_to1 = np.zeros(5)
pred_to2 = np.zeros(5)
pred_to3 = np.zeros(5)
pred_to4 = np.zeros(5)

count0 = 0
count1 = 0
count2 = 0
count3 = 0
count4 = 0

y_predict = model.predict(testX, batch_size = 32, verbose = 0)

for index, val in enumerate(y_predict.argmax(axis=1)):
    if val == 0:
        pred_to0 += y_predict[index]
        count0 += 1
    
    elif val ==1:
        pred_to1 += y_predict[index]
        count1 += 1
    
    elif val ==2:
        pred_to2 += y_predict[index]
        count2 += 1
    
    elif val ==3:
        pred_to3 += y_predict[index]
        count3 += 1
        
    elif val ==4:
        pred_to4 += y_predict[index]
        count4 += 1
In [88]:
print(count0, count1, count2, count3, count4)
799 0 793 784 796
In [89]:
cm/793
Out[89]:
array([[1.        , 0.        , 0.        , 0.        ],
       [0.        , 1.        , 0.        , 0.        ],
       [0.0075662 , 0.        , 0.98865069, 0.0037831 ],
       [0.        , 0.        , 0.        , 1.        ]])
In [91]:
# print(
#     cm[0,0],
#     cm[1,1],
#     cm[2,2],
#     cm[3,3],
#     cm[4,4]
# )
In [ ]:
y_predict[2]
In [ ]:
pred_to1
In [ ]:
print(np.round(pred_to0/count0*100, 3), '\n', 
      np.round(pred_to1/count1*100, 3), '\n',
      np.round(pred_to2/count2*100, 3), '\n',
      np.round(pred_to3/count3*100, 3), '\n',
      np.round(pred_to4/count4*100, 3), '\n',
     )
In [359]:
fig, loss_ax = plt.subplots()
acc_ax = loss_ax.twinx()

loss_ax.plot(hist.history['loss'], 'y', label='train loss')
loss_ax.plot(hist.history['val_loss'], 'r', label='val loss')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
loss_ax.legend(loc='lower right')

acc_ax.plot(hist.history['accuracy'], 'b', label='train acc')
acc_ax.plot(hist.history['val_accuracy'], 'g', label='val acc')
acc_ax.set_ylabel('accuracy')
acc_ax.legend(loc='upper right')

plt.savefig('saved_images/220414/acc_loss_trend.svg', dpi='figure', format='svg')
In [443]:
# repeat experiment
repeats = 10
scores = []
for r in range(repeats):
    loss, score, hist = evaluate_model(trainX, trainy, valX, valy, testX, testy)
    score = score * 100.0
    print('>#%d: %.3f' % (r+1, score))
    scores.append(score)
>#1: 100.000
>#2: 100.000
>#3: 100.000
>#4: 100.000
>#5: 100.000
>#6: 100.000
>#7: 100.000
>#8: 100.000
>#9: 100.000
>#10: 100.000
In [341]:
from sklearn.metrics import roc_curve
from sklearn.metrics import auc

# Compute ROC curve and ROC area for each class
n_classes = n_outputs
y_test = testy
y_score = model.predict(testX, batch_size = 5, verbose = 0)
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

# Plot of a ROC curve for a specific class
plt.figure()
plt.plot(fpr[2], tpr[2], label='ROC curve (area = %0.2f)' % roc_auc[2])
plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 0.001])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.savefig('saved_images/220414/ROC_curve_1.svg', dpi='figure', format='svg')

# Plot ROC curve
plt.figure()
plt.plot(fpr["micro"], tpr["micro"],
         label='micro-average ROC curve (area = {0:0.2f})'
               ''.format(roc_auc["micro"]))
for i in range(n_classes):
    plt.plot(fpr[i], tpr[i], label='ROC curve of class {0} (area = {1:0.2f})'
                                   ''.format(i, roc_auc[i]))

plt.plot([0, 1], [0, 1], 'k--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Some extension of Receiver operating characteristic to multi-class')
plt.legend(loc="lower right")
plt.savefig('saved_images/220414/ROC_curve_2.svg', dpi='figure', format='svg')